const arr = [2, 3, 4, 5, 5, 6, 7];


/* 
- previousValue：上一次调用 callbackFn 时的返回值。在第一次调用时，若指定了初始值 initialValue，其值则为 initialValue，否则为数组索引为 0 的元素 array[0]。
- currentValue：数组中正在处理的元素。在第一次调用时，若指定了初始值 initialValue，其值则为数组索引为 0 的元素 array[0]，否则为 array[1]。
- currentIndex：数组中正在处理的元素的索引。若指定了初始值 initialValue，则起始索引号为 0，否则从索引 1 起始。
- array：用于遍历的数组。
 
 1、previousValue （上一次调用回调返回的值，或者是提供的初始值（initialValue））
 2、currentValue （数组中当前被处理的元素）
 3、index （当前元素在数组中的索引）
 4、array （调用 reduce 的数组）
 
 返回最后一次执行reduce回调函数的值
*/

/* const sum = arr.reduce((prev, cur, index, arr) => {
    console.log(prev, cur, index);
    return prev + cur
}, 0)
 
console.log(arr, sum);
 */
// 计算数组每个元素出现的次数
(
    () => {
        const str = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
        const arr1 = str.reduce((value, item) => {
            value[item] ? value[item]++ : value[item] = 1
            return value
        }, {})
        console.log(arr1);
    }
)();


// 数组去重
(
    () => {
        const str = [1, 2, 3, 4, 4, 1]
        const newStr = arr.reduce((prev, cur) => {
            if (!prev.includes(cur)) { // 如果该元素在去重后的数组不存在
                return prev.concat(cur) // Array.prototype.concat() 用于连接两个或多个数组，不会更改现有数组，返回一个新数组
            } else {
                return prev // 如果该元素在去重后的数组存在，直接返回去重后的数组
            }
        }, [])
        console.log(newStr);
    }
)()